﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections.ObjectModel;

namespace System.Erp.Runtime.Composition
{
    /// <summary>
    /// 提供一种接口，用于描述零件的组合，可以成为功能包。
    /// </summary>
    /// <remarks>
    /// <para>我们可以认为一个组装件是一组零件的组合，他可能内部提供了很多的零件，其中的一个类也可以提供多个零件。</para>
    /// <para>对应的，你可以认为一个项目配置文件也是一个零件的组合。任何一个零件的组合都能够用一个指针描述。</para>
    /// </remarks>
    [Serializable]
    public sealed class AggregateCatalog : PartCatalogBase
    {
        /// <summary>
        /// 初始化对象
        /// </summary>
        public AggregateCatalog()
        {
            this._catalogs = new Collection<Tuple<PartAction, IPartCatalog>>();
            this._parts = new Collection<Tuple<PartAction, IPart>>();
        }

        private Collection<Tuple<PartAction,IPartCatalog>> _catalogs;
        /// <summary>
        /// 返回子组合的集合
        /// </summary>
        public Collection<Tuple<PartAction,IPartCatalog>> Catalogs
        {
            get { return _catalogs; }
        }

        /// <summary>
        /// 创建一个当前组合的子组合。
        /// </summary>
        protected override ReadOnlyCollection<Tuple<PartAction, IPartCatalog>> CreateCatalogs()
        {
            return new ReadOnlyCollection<Tuple<PartAction, IPartCatalog>>(_catalogs);
        }
        
        private Collection<Tuple<PartAction, IPart>> _parts;
        /// <summary>
        /// 返回当前组合的直接零件的集合
        /// </summary>
        public Collection<Tuple<PartAction, IPart>> Parts
        {
            get { return _parts; }
        }

        /// <summary>
        /// 创建一个当前组合的子对象集合
        /// </summary>
        /// <returns></returns>
        protected override ReadOnlyCollection<Tuple<PartAction, IPart>> CreateParts()
        {
            return new ReadOnlyCollection<Tuple<PartAction, IPart>>(this._parts);
        }
    }
}